package com.huanzhidadi.rollback.controller;

import com.huanzhidadi.rollback.biz.UserBiz;
import com.huanzhidadi.rollback.exception.BaseException;
import com.huanzhidadi.rollback.model.UserVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.validation.Valid;

@RestController
@RequestMapping("user")
public class UserController {

    @Autowired
    private UserBiz userBiz;

    /**
     * 父方法加@Transactional注解，捕获异常，手动回滚事务
     * 子方法不加注解，不捕获异常，抛出异常
     * 另一个子方法回滚事务
     * @param userVO
     * @return
     */
    @PostMapping("save1")
    public int saveUser1(@RequestBody UserVO userVO) {
        return userBiz.saveUser1(userVO);
    }

    /**
     * 父方法加@Transactional(rollbackFor = Exception.class)注解，抛出异常
     * 子方法不加注解，不捕获异常，抛出异常
     * 另一个子方法回滚事务
     *
     * @Transactional(rollbackFor = Exception.class) 配合 throws Exception 自动回滚
     * @param userVO
     * @return
     * @throws Exception
     */
    @PostMapping("save2")
    public int saveUser2(@Valid @RequestBody UserVO userVO) throws BaseException {
        return userBiz.saveUser2(userVO);
    }

    /**
     * 父方法加@Transactional注解，父方法产生并捕获异常，手动回滚事务
     * 子方法不加注解
     * 所有子方法回滚事务
     * @Transactional 配合 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); 手动回滚
     * 需配合@Transactional
     * 不用加rollbackFor
     * 子service不用加事务注解
     * @param userVO
     * @return
     */
    @PostMapping("save3")
    public int saveUser3(@RequestBody UserVO userVO) {
        return userBiz.saveUser3(userVO);
    }

    /**
     * 父方法不加注解，产生异常并抛出，手动回滚
     * 子方法加@Transactional(rollbackFor = Exception.class)注解
     * 子方法不回滚事务
     *
     * 只在子方法上加注解不能回滚
     * @param userVO
     * @return
     */
    @PostMapping("save4")
    public int saveUser4(@RequestBody UserVO userVO) {
        return userBiz.saveUser4(userVO);
    }

    @PostMapping("save5")
    public int saveUser5(@RequestBody UserVO userVO) throws Exception {
        return userBiz.saveUser5(userVO);
    }
}
